home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / classinfo / ClassInfoUtilities.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  6.4 KB  |  288 lines

  1. package koala.dynamicjava.classinfo;
  2.  
  3. import java.lang.reflect.Modifier;
  4. import java.util.Iterator;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import koala.dynamicjava.util.AmbiguousFieldException;
  8.  
  9. public class ClassInfoUtilities {
  10.    // $FF: synthetic field
  11.    private static Class class$Ljava$lang$Object;
  12.  
  13.    public static ConstructorInfo lookupConstructor(ClassInfo var0, ClassInfo[] var1) throws NoSuchMethodException {
  14.       List var2 = getConstructors(var0, var1.length);
  15.       LinkedList var3 = new LinkedList();
  16.  
  17.       for(ConstructorInfo var5 : var2) {
  18.          if (hasCompatibleSignatures(var5.getParameterTypes(), var1)) {
  19.             var3.add(var5);
  20.          }
  21.       }
  22.  
  23.       if (var3.isEmpty()) {
  24.          throw new NoSuchMethodException(var0.getName() + " constructor");
  25.       } else {
  26.          Iterator var6 = var3.iterator();
  27.  
  28.          ConstructorInfo var7;
  29.          for(var7 = (ConstructorInfo)var6.next(); var6.hasNext(); var7 = selectTheMostSpecificConstructor(var7, (ConstructorInfo)var6.next())) {
  30.          }
  31.  
  32.          return var7;
  33.       }
  34.    }
  35.  
  36.    public static boolean isAssignableFrom(ClassInfo var0, ClassInfo var1) {
  37.       if (var0.isPrimitive()) {
  38.          if (var0.equals(var1)) {
  39.             return true;
  40.          } else if (var1 != null && var1.isPrimitive()) {
  41.             Class var2 = var0.getJavaClass();
  42.             Class var3 = var1.getJavaClass();
  43.             if (var2 == Short.TYPE) {
  44.                return var3 == Byte.TYPE;
  45.             } else if (var2 == Integer.TYPE) {
  46.                return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Character.TYPE;
  47.             } else if (var2 == Long.TYPE) {
  48.                return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Integer.TYPE;
  49.             } else if (var2 == Float.TYPE) {
  50.                return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Integer.TYPE || var3 == Float.TYPE;
  51.             } else if (var2 != Double.TYPE) {
  52.                return false;
  53.             } else {
  54.                return var3 == Byte.TYPE || var3 == Short.TYPE || var3 == Integer.TYPE || var3 == Float.TYPE || var3 == Double.TYPE;
  55.             }
  56.          } else {
  57.             return false;
  58.          }
  59.       } else if (var1 != null && !var0.equals(var1)) {
  60.          return isAncestorOf(var0, var1) || isInterfaceOf(var0, var1);
  61.       } else {
  62.          return true;
  63.       }
  64.    }
  65.  
  66.    public static FieldInfo getField(ClassInfo var0, String var1) throws NoSuchFieldException, AmbiguousFieldException {
  67.       for(ClassInfo var2 = var0; var2 != null; var2 = var2.getSuperclass()) {
  68.          FieldInfo[] var3 = var2.getFields();
  69.  
  70.          for(int var4 = 0; var4 < var3.length; ++var4) {
  71.             if (var3[var4].getName().equals(var1)) {
  72.                return var3[var4];
  73.             }
  74.          }
  75.  
  76.          ClassInfo[] var10 = var2.getInterfaces();
  77.          FieldInfo var5 = null;
  78.  
  79.          for(int var6 = 0; var6 < var10.length; ++var6) {
  80.             FieldInfo var7 = null;
  81.  
  82.             try {
  83.                var7 = getField(var10[var6], var1);
  84.             } catch (NoSuchFieldException var9) {
  85.             }
  86.  
  87.             if (var7 != null) {
  88.                if (var5 != null && !var5.equals(var7)) {
  89.                   throw new AmbiguousFieldException(var1);
  90.                }
  91.  
  92.                var5 = var7;
  93.             }
  94.          }
  95.  
  96.          if (var5 != null) {
  97.             return var5;
  98.          }
  99.       }
  100.  
  101.       throw new NoSuchFieldException(var1);
  102.    }
  103.  
  104.    public static FieldInfo getOuterField(ClassInfo var0, String var1) throws NoSuchFieldException, AmbiguousFieldException {
  105.       boolean var2 = Modifier.isStatic(var0.getModifiers());
  106.  
  107.       for(ClassInfo var3 = var0 != null ? var0.getDeclaringClass() : null; var3 != null; var3 = var3.getDeclaringClass()) {
  108.          var2 |= Modifier.isStatic(var3.getModifiers());
  109.  
  110.          try {
  111.             FieldInfo var4 = getField(var3, var1);
  112.             if (!var2 || Modifier.isStatic(var4.getModifiers())) {
  113.                return var4;
  114.             }
  115.          } catch (NoSuchFieldException var5) {
  116.          }
  117.       }
  118.  
  119.       throw new NoSuchFieldException(var1);
  120.    }
  121.  
  122.    public static MethodInfo lookupMethod(ClassInfo var0, String var1, ClassInfo[] var2) throws NoSuchMethodException {
  123.       List var3 = getMethods(var0, var1, var2.length);
  124.       LinkedList var4 = new LinkedList();
  125.  
  126.       for(MethodInfo var6 : var3) {
  127.          if (hasCompatibleSignatures(var6.getParameterTypes(), var2)) {
  128.             var4.add(var6);
  129.          }
  130.       }
  131.  
  132.       if (var4.isEmpty()) {
  133.          throw new NoSuchMethodException(var1);
  134.       } else {
  135.          Iterator var7 = var4.iterator();
  136.  
  137.          MethodInfo var8;
  138.          for(var8 = (MethodInfo)var7.next(); var7.hasNext(); var8 = selectTheMostSpecificMethod(var8, (MethodInfo)var7.next())) {
  139.          }
  140.  
  141.          return var8;
  142.       }
  143.    }
  144.  
  145.    public static MethodInfo lookupOuterMethod(ClassInfo var0, String var1, ClassInfo[] var2) throws NoSuchMethodException {
  146.       boolean var3 = Modifier.isStatic(var0.getModifiers());
  147.  
  148.       for(ClassInfo var4 = var0 != null ? var0.getDeclaringClass() : null; var4 != null; var4 = var4.getDeclaringClass()) {
  149.          var3 |= Modifier.isStatic(var4.getModifiers());
  150.  
  151.          try {
  152.             MethodInfo var5 = lookupMethod(var4, var1, var2);
  153.             if (!var3 || Modifier.isStatic(var5.getModifiers())) {
  154.                return var5;
  155.             }
  156.          } catch (NoSuchMethodException var6) {
  157.          }
  158.       }
  159.  
  160.       throw new NoSuchMethodException(var1);
  161.    }
  162.  
  163.    public static List getMethods(ClassInfo var0, String var1, int var2) {
  164.       LinkedList var3 = new LinkedList();
  165.       if (var0.isInterface()) {
  166.          MethodInfo[] var4 = var0.getMethods();
  167.  
  168.          for(int var5 = 0; var5 < var4.length; ++var5) {
  169.             if (var4[var5].getName().equals(var1) && var4[var5].getParameterTypes().length == var2) {
  170.                var3.add(var4[var5]);
  171.             }
  172.          }
  173.  
  174.          ClassInfo[] var8 = var0.getInterfaces();
  175.  
  176.          for(int var6 = 0; var6 < var8.length; ++var6) {
  177.             var3.addAll(getMethods(var8[var6], var1, var2));
  178.          }
  179.       } else {
  180.          for(ClassInfo var7 = var0; var7 != null; var7 = var7.getSuperclass()) {
  181.             MethodInfo[] var9 = var7.getMethods();
  182.  
  183.             for(int var10 = 0; var10 < var9.length; ++var10) {
  184.                if (var9[var10].getName().equals(var1) && var9[var10].getParameterTypes().length == var2) {
  185.                   var3.add(var9[var10]);
  186.                }
  187.             }
  188.          }
  189.       }
  190.  
  191.       return var3;
  192.    }
  193.  
  194.    private static List getConstructors(ClassInfo var0, int var1) {
  195.       LinkedList var2 = new LinkedList();
  196.       ConstructorInfo[] var3 = var0.getConstructors();
  197.  
  198.       for(int var4 = 0; var4 < var3.length; ++var4) {
  199.          if (var3[var4].getParameterTypes().length == var1) {
  200.             var2.add(var3[var4]);
  201.          }
  202.       }
  203.  
  204.       return var2;
  205.    }
  206.  
  207.    private static ConstructorInfo selectTheMostSpecificConstructor(ConstructorInfo var0, ConstructorInfo var1) {
  208.       ClassInfo[] var2 = var0.getParameterTypes();
  209.       ClassInfo[] var3 = var1.getParameterTypes();
  210.  
  211.       for(int var4 = 0; var4 < var2.length; ++var4) {
  212.          if (var2[var4] != var3[var4]) {
  213.             return isAssignableFrom(var2[var4], var3[var4]) ? var1 : var0;
  214.          }
  215.       }
  216.  
  217.       return var0;
  218.    }
  219.  
  220.    private static MethodInfo selectTheMostSpecificMethod(MethodInfo var0, MethodInfo var1) {
  221.       ClassInfo[] var2 = var0.getParameterTypes();
  222.       ClassInfo[] var3 = var1.getParameterTypes();
  223.  
  224.       for(int var4 = 0; var4 < var2.length; ++var4) {
  225.          if (var2[var4] != var3[var4]) {
  226.             return isAssignableFrom(var2[var4], var3[var4]) ? var1 : var0;
  227.          }
  228.       }
  229.  
  230.       return var0;
  231.    }
  232.  
  233.    private static boolean hasCompatibleSignatures(ClassInfo[] var0, ClassInfo[] var1) {
  234.       for(int var2 = 0; var2 < var0.length; ++var2) {
  235.          if (!isAssignableFrom(var0[var2], var1[var2])) {
  236.             return false;
  237.          }
  238.       }
  239.  
  240.       return true;
  241.    }
  242.  
  243.    private static boolean isAncestorOf(ClassInfo var0, ClassInfo var1) {
  244.       ClassInfo var2;
  245.       for(var2 = var1.getSuperclass(); var2 != null && !var2.equals(new JavaClassInfo(class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object")))); var2 = var2.getSuperclass()) {
  246.          if (var2.equals(var0)) {
  247.             return true;
  248.          }
  249.       }
  250.  
  251.       return var2 != null && var2.equals(var0);
  252.    }
  253.  
  254.    private static boolean isInterfaceOf(ClassInfo var0, ClassInfo var1) {
  255.       if (!var0.isInterface()) {
  256.          return false;
  257.       } else {
  258.          for(ClassInfo var2 = var1; var2 != null && !var2.equals(new JavaClassInfo(class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object")))); var2 = var2.getSuperclass()) {
  259.             ClassInfo[] var3 = var2.getInterfaces();
  260.  
  261.             for(int var4 = 0; var4 < var3.length; ++var4) {
  262.                if (var3[var4].equals(var0)) {
  263.                   return true;
  264.                }
  265.  
  266.                if (isInterfaceOf(var0, var3[var4])) {
  267.                   return true;
  268.                }
  269.             }
  270.          }
  271.  
  272.          return false;
  273.       }
  274.    }
  275.  
  276.    // $FF: synthetic method
  277.    static Class class$(String var0) {
  278.       try {
  279.          return Class.forName(var0);
  280.       } catch (ClassNotFoundException var2) {
  281.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  282.       }
  283.    }
  284.  
  285.    private ClassInfoUtilities() {
  286.    }
  287. }
  288.